在 Ruby 裡有四種變數(全域變數、區域變數、實體變數以及類別變數)、一種常數(字首大寫者)以及兩種擬變數 (pseudo-variable)。
nil
代表無意義值,self
則表示永遠指示目前正在執行的物件。在更早之前的學習經驗裡,我們可以定義一個方法,然後直接呼叫方法名稱來使用,但經過昨天的探討,大部分方法前面不都應該接一個物件嗎?
你知道self早就存在了嗎?
def fat_thor
puts " I'm still worthy! "
end
self.fat_thor
# 印出 private method `a_method' called for main:Object
self.private_methods.include?(:fat_thor) # 印出 true
p self # 印出 main
p self.class # 印出 Object
用 private_methods
檢驗一下, fat_thor 果真是從 self 所屬的 class 定義的,而 self 代表 main
,self 是 Object
的實體
難道什麼 scope 都沒寫就代表在 Object 裡?
這裡用開放類別來測試一下:
class Object
p self
def stark
puts " I love 3000! "
end
end
# 印出Object
self.stark # 印出 I love 3000!
stark # 印出 I love 3000!
可以直接呼叫方法
整理一下:
self
可以想成該 scope 的值(即可以用 self
確認所在的 scope),而 scope 的尋找方法可看成找最接近的 object
,在實體方法中就是實體,在類別方法中當然就是類別自己。
未宣告任何 local scope 之前,我們處在 top level scope,在這裡 self
本身帶有值並自稱 main,查找 main:Objectc 會得到一組 hash{main=>Objectc}
。
在 top level scope 寫出的方法可以直接呼叫,但為 private
方法;在 Object 中則是 public
方法,可以掛在 self 身上呼叫,卻也能直接呼叫,難道 main 某種程度上等同 Object?
參考一些資料,在 OOP 中的 method 幾乎都可表現為 obj.method_name(private 除外),此時物件(obj)為訊息接收者(reciever),method_name 代表訊息(messege),而該 method 所屬的 scope 為訊息傳遞者(sender)。
此文同步刊登於CJ-Han的網站